﻿using LM.InterfacesFabricas.Basicos.Enumeradores;
using LM.InterfacesFabricas.DTOs;
using LM.InterfacesFabricas.Fabricas;
using LM.InterfacesFabricas.Interfaces.Servicos;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Globalization;
using LM.InterfacesFabricas.Utilidades;
using LM.Tela.Desktop.Utilidades;

namespace LM.Tela.Desktop
{
    public partial class frmCliente : Form
    {
        public DtoCliente cliente;

        public frmCliente()
        {
            InitializeComponent();
        }

        private void frmCliente_Load(object sender, EventArgs e)
        {
            cliente = new DtoCliente();
            CarregueItensJaCadastrados();
            cbTipoCliente.DataSource = Enum.GetValues(typeof(EnumTipoDoCliente));
        }

        private void CarregueItensJaCadastrados()
        {
            var servico = FabricaGenerica.Crie<IServicoDeCliente>();
            var clientes = servico.ConsulteTodos();

            dgClientes.DataSource = clientes;
        }

        private bool EmEdicao()
        {
            return !string.IsNullOrWhiteSpace(mskTxtCodigo.Text) && mskTxtCodigo.Enabled == false;
        }

        private void btnSalvar_Click(object sender, EventArgs e)
        {
            var servico = FabricaGenerica.Crie<IServicoDeCliente>();

            if (!EmEdicao())
            {
                servico.Cadastre(ObtemClienteDoFormulario());
                this.ExibaMensagem(GlossarioDeMensagem.MSG01);
            }
            else
            {
                servico.Atualize(ObtemClienteDoFormulario());
                this.ExibaMensagem(GlossarioDeMensagem.MSG02);
            }

            PrepareTelaParaNovoRegistro();
        }

        private void PrepareTelaParaNovoRegistro()
        {
            ControladorDeFormulario.LimpaFormulario(this);
            CarregueItensJaCadastrados();
            mskTxtCodigo.Enabled = true;
            mskTxtCodigo.Focus();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            var frmTelefone = new frmTelefone(this);
            frmTelefone.Telefones = cliente.Telefones;
            frmTelefone.ShowDialog(this);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            var frmEndereco = new frmEndereco(this);
            frmEndereco.Enderecos = cliente.Endereco;
            frmEndereco.ShowDialog(this);
        }
        
        private DtoCliente ObtemClienteDoFormulario()
        {
            int codigo;
            int.TryParse(mskTxtCodigo.Text, out codigo);

            long cpf;
            long.TryParse(mskTxtCpf.Text, out cpf);

            int cnh;
            int.TryParse(txtCnh.Text, out cnh);

            cliente.Codigo = codigo;
            cliente.Nome = txtNome.Text;
            cliente.Cpf = cpf;
            cliente.Cnh = cnh;
            cliente.TipoDoCliente = (EnumTipoDoCliente)cbTipoCliente.SelectedItem;

            //Lista de Cliente é recibida pelo formulário
            //cliente.Telefones = Telefones;
            return cliente;
        }

        private void dgClientes_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex >= 0)
            {
                cliente = new DtoCliente();
                cliente = ((IList<DtoCliente>)dgClientes.DataSource)[e.RowIndex];
                MostraClienteNoFormulario();
            }
        }

        public void MostraClienteNoFormulario() 
        {
            if (cliente.Codigo != 0)
            {
                mskTxtCodigo.Text = cliente.Codigo.ToString(CultureInfo.InvariantCulture);
                mskTxtCodigo.Enabled = false;
                txtNome.Text = cliente.Nome;
                cbTipoCliente.SelectedItem = cliente.TipoDoCliente;
                mskTxtCpf.Text = cliente.Cpf.ToString("00000000000");
                txtCnh.Text = cliente.Cnh.ToString();
            }
            if (cliente.Telefones.Count > 0)
            {
                var telefone = cliente.Telefones.FirstOrDefault().Ddd.ToString() + cliente.Telefones.FirstOrDefault().Numero;
                mskTxtTelefones.Text = telefone;
            }
            else
            {
                mskTxtTelefones.Text = String.Empty;
            }

            if (cliente.Endereco.Count > 0)
            {
                var endereco = cliente.Endereco.FirstOrDefault();
                var enderecoFormatado = string.Format(CultureInfo.InvariantCulture, "{0}, Nº {1}, Lt.{2}, Qd.{3}", endereco.Logradouro, endereco.Numero, endereco.Lote, endereco.Quadra);
                txtEndereco.Text = enderecoFormatado;
            }
            else
            {
                txtEndereco.Text = String.Empty;
            } 
        }

        private void btnExcluir_Click(object sender, EventArgs e)
        {
            if (!EmEdicao())
            {
                this.ExibaInconsistencia(GlossarioDeMensagem.MSG09);
            }
            else
            {
                var servico = FabricaGenerica.Crie<IServicoDeCliente>();
                servico.Exclua(int.Parse(mskTxtCodigo.Text));

                PrepareTelaParaNovoRegistro();
            }
        }

        private void btnNovo_Click(object sender, EventArgs e)
        {
            PrepareTelaParaNovoRegistro();
        }
    }
}
